﻿
/* 系统初始化. add by terry */

/* 默认配置 */
var defaultConfig={
    data:{"nodes":[],"links":[]},
    width:window.innerWidth,
    height:window.innerHeight-17,
    distance:100
};

/* 存储svg变量. */
var vis,_this,highlighted=null,dependsNode=[],dependsLinkAndText=[];

/* 初始化相关JS. add by terry */
d3.json("./js/data/mydata.json", function(json) {
    function GroupExplorer(wrapper,config){

		/* 加载配置. */
		$.extend(true,defaultConfig,config);

        defaultConfig.data.links.forEach(function (e) {
            if(typeof e.source!="number"&&typeof e.target!="number"){
                var sourceNode = defaultConfig.data.nodes.filter(function (n) {
                            return n.id === e.source;   //sm
                        })[0],
                        targetNode = defaultConfig.data.nodes.filter(function (n) {
                            return n.id === e.target;   //sm
                        })[0];
                e.source = sourceNode;
                e.target = targetNode;
            }
        });

        _this=this;
        var zoom = d3.zoom()
                .scaleExtent([0.2,10])
                .on("zoom",function(){
                    _this.zoomed();
                });
                
		// 向body中，添加svg标签.
        this.vis = d3.select("body").append("svg:svg")
                .attr("width", defaultConfig.width)
                .attr("height", defaultConfig.height)
                .call(zoom).on("dblclick.zoom", null);

        this.vis=this.vis.append('g').attr('class','all')
                .attr("width", defaultConfig.width)
                .attr("height", defaultConfig.height);


        this.force = d3.forceSimulation()
                .nodes(defaultConfig.data.nodes)
                .force("link", d3.forceLink(defaultConfig.data.links).distance(defaultConfig.distance))
                .force("charge", d3.forceManyBody())
                .force("center", d3.forceCenter(defaultConfig.width / 2, defaultConfig.height / 2))
                .force("charge",d3.forceManyBody())
                .force("collide",d3.forceCollide(60).strength(0.2).iterations(5))

		// 初始化箭头等组件.
		initAssets(this.vis);
		// 添加线条.
        this.link = lineInit(this.vis);
		// 提示栏相关操作 。（向body下，动态添加div标签。）
        this.tooltip=initToolTip();
		// 节点初始化相关操作.
        this.node = nodeInit(this.vis);
		// 设置线条文本.
        this.linetext=lineTextInit(this.vis);

        this.zoomed=function(){
            _this.vis.attr("transform", d3.event.transform);
        };

        // 刷新设置.
        window.tick = this.tick=function() {
            // 设置线条弧度.
            _this.link.attr("d", function(d) {
                //弧线路径位置
                return arcPath(false, d);
            });
            //关系文字显示的位置
            _this.linetext.attr("d", function(d) {
                return arcTextPath(d.source.x < d.target.x, d);
            });
            // 节点设置.
            _this.node.attr("transform", function(d) {
            	return "translate(" + d.x + "," + d.y + ")"; 
            });
            
        };
        _this.force.on("tick", this.tick);

    }
    new GroupExplorer('body',{
        data:json
    });
});